
package com.example.chapter06.database;
import com.example.chapter06.entity.CartInfo;

import java.sql.*;
import java.util.List;
import java.util.TimerTask;

/**
 * 定时任务类，用于将本地购物车数据上传到云端数据库。
 */
public class UpLoader extends TimerTask {
    private final CartDatabase cartDatabase;
    private final String CLOUD_DB_URL = "jdbc:mysql://112.124.63.147:3306/userdb";
    private final String DB_USER = "userdb";
    private final String DB_PASSWORD = "Bdbg2181";

    /**
     * 构造函数，初始化本地购物车数据库实例。
     *
     * @param cartDatabase 本地购物车数据库实例
     */
    public UpLoader(CartDatabase cartDatabase) {
        this.cartDatabase = cartDatabase;
    }

    /**
     * 定时任务的运行方法，负责将本地购物车数据上传到云端数据库。
     */
    @Override
    public void run() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver"); // 加载 MySQL JDBC 驱动
            try (Connection connection = DriverManager.getConnection(CLOUD_DB_URL, DB_USER, DB_PASSWORD)) {
                List<CartInfo> cartList = cartDatabase.cartDao().queryAllCart(); // 查询本地购物车数据
                uploadCartToCloud(connection, cartList); // 将数据上传到云端
            }
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常堆栈信息
        }
    }

    /**
     * 将购物车数据上传到云端数据库。
     *
     * @param connection 数据库连接
     * @param cartList 购物车数据列表
     * @throws SQLException 如果执行 SQL 语句时发生错误
     */
    private void uploadCartToCloud(Connection connection, List<CartInfo> cartList) throws SQLException {
        String insert = "INSERT INTO CartInfo (id, goodsId, count, updateTime) VALUES (?, ?, ?, ?) " +
                "ON DUPLICATE KEY UPDATE count = VALUES(count), updateTime = VALUES(updateTime)"; // 插入或更新 SQL 语句

        try (PreparedStatement stmt = connection.prepareStatement(insert)) {
            for (CartInfo cart : cartList) {
                stmt.setLong(1, cart.getId()); // 设置 id
                stmt.setLong(2, cart.getGoodsId()); // 设置 goodsId
                stmt.setInt(3, cart.getCount()); // 设置 count
                stmt.setString(4, cart.getUpdateTime()); // 设置 updateTime
                stmt.addBatch(); // 添加到批处理
            }
            stmt.executeBatch(); // 执行批处理
        }
    }
}